package repository

import (
	"user/domain/model"

	"gorm.io/gorm"
)

type IUserRepository interface {
	InitTable() error
	FindUserByName(string) (*model.User, error)
	FindUserByID(int64) (*model.User, error)
	Createuser(*model.User) (int64, error)
	DeleteUserByID(int64) error
	UpdateUser(*model.User) error
	FindAll() ([]model.User, error)
}

type UserRepository struct {
	mysqlDb *gorm.DB
}

// 查找所有用户
func (ur *UserRepository) FindAll() ([]model.User, error) {
	userAll := []model.User{}
	return userAll, ur.mysqlDb.Find(&userAll).Error
}

// 创建用户
func (ur *UserRepository) Createuser(*model.User) (int64, error) {
	user := &model.User{}
	return user.ID, ur.mysqlDb.Create(user).Error
}

// 根据用户ID删除用户
func (ur *UserRepository) DeleteUserByID(userID int64) error {
	return ur.mysqlDb.Where("id = ?", userID).Delete(&model.User{}).Error
}

// 根据用户ID查找用户
func (ur *UserRepository) FindUserByID(userID int64) (*model.User, error) {
	user := &model.User{}
	return user, ur.mysqlDb.First(user, userID).Error
}

// 根据用户名查找用户
func (ur *UserRepository) FindUserByName(username string) (*model.User, error) {
	user := &model.User{}
	return user, ur.mysqlDb.Where("username = ?", username).Find(user).Error
}

// 更新用户信息
func (ur *UserRepository) UpdateUser(*model.User) error {
	user := &model.User{}
	return ur.mysqlDb.Save(user).Error
}

// 初始化表
func (ur *UserRepository) InitTable() error {
	err := ur.mysqlDb.Migrator().CreateTable(&model.User{})
	return err
}

func NewUserRepository(db *gorm.DB) IUserRepository {
	return &UserRepository{mysqlDb: db}
}
